[[...path]].page.tsx 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. import React from 'react';
  2. import {
  3. NextPage, GetServerSideProps, GetServerSidePropsContext,
  4. } from 'next';
  5. import { useTranslation } from 'next-i18next';
  6. import dynamic from 'next/dynamic';
  7. import { useRouter } from 'next/router';
  8. import { CrowiRequest } from '~/interfaces/crowi-request';
  9. import { CommonProps, getServerSideCommonProps, useCustomTitle } from '~/pages/commons';
  10. import PluginUtils from '~/server/plugins/plugin-utils';
  11. import ConfigLoader from '~/server/service/config-loader';
  12. import {
  13. useCurrentUser, /* useSearchServiceConfigured, */ useIsSearchServiceReachable, useSiteUrl,
  14. } from '~/stores/context';
  15. // import { useEnvVars } from '~/stores/admin-context';
  16. const pluginUtils = new PluginUtils();
  17. type Props = CommonProps & {
  18. currentUser: any,
  19. nodeVersion: string,
  20. npmVersion: string,
  21. yarnVersion: string,
  22. installedPlugins: any,
  23. envVars: any,
  24. isSearchServiceConfigured: boolean,
  25. isSearchServiceReachable: boolean,
  26. siteUrl: string,
  27. };
  28. const AdminMarkdownSettingsPage: NextPage<Props> = (props: Props) => {
  29. const { t } = useTranslation();
  30. const router = useRouter();
  31. const path = router.query.path || 'home';
  32. const name = Array.isArray(path) ? path[0] : path;
  33. const AdminHome = dynamic(() => import('../../components/Admin/AdminHome/AdminHome'), { ssr: false });
  34. const AppSettingsPageContents = dynamic(() => import('../../components/Admin/App/AppSettingsPageContents'), { ssr: false });
  35. const SecurityManagementContents = dynamic(() => import('../../components/Admin/Notification/NotificationSetting'), { ssr: false });
  36. const MarkDownSettingContents = dynamic(() => import('../../components/Admin/MarkdownSetting/MarkDownSettingContents'), { ssr: false });
  37. const CustomizeSettingContents = dynamic(() => import('../../components/Admin/Customize/Customize'), { ssr: false });
  38. const DataImportPageContents = dynamic(() => import('../../components/Admin/ImportData/ImportDataPageContents'), { ssr: false });
  39. const ExportArchiveDataPage = dynamic(() => import('../../components/Admin/ExportArchiveDataPage'), { ssr: false });
  40. const NotificationSetting = dynamic(() => import('../../components/Admin/Notification/NotificationSetting'), { ssr: false });
  41. const SlackIntegration = dynamic(() => import('../../components/Admin/SlackIntegration/SlackIntegration'), { ssr: false });
  42. const LegacySlackIntegration = dynamic(() => import('../../components/Admin/LegacySlackIntegration/LegacySlackIntegration'), { ssr: false });
  43. const UserManagement = dynamic(() => import('../../components/Admin/UserManagement'), { ssr: false });
  44. const UserGroupPage = dynamic(() => import('../../components/Admin/UserGroup/UserGroupPage'), { ssr: false });
  45. const ElasticsearchManagement = dynamic(() => import('../../components/Admin/ElasticsearchManagement/ElasticsearchManagement'), { ssr: false });
  46. // named export
  47. const AuditLogManagement = dynamic(() => import('../../components/Admin/AuditLogManagement').then(module => module.AuditLogManagement));
  48. const AdminLayout = dynamic(() => import('../../components/Layout/AdminLayout'), { ssr: false });
  49. const adminPagesMap = {
  50. home: {
  51. title: useCustomTitle(props, t('Wiki Management Home Page')),
  52. component: <AdminHome
  53. nodeVersion={props.nodeVersion}
  54. npmVersion={props.npmVersion}
  55. yarnVersion={props.yarnVersion}
  56. installedPlugins={props.installedPlugins}
  57. />,
  58. },
  59. app: {
  60. title: useCustomTitle(props, t('App Settings')),
  61. component: <AppSettingsPageContents />,
  62. },
  63. security: {
  64. title: useCustomTitle(props, t('security_settings')),
  65. component: <SecurityManagementContents />,
  66. },
  67. markdown: {
  68. title: useCustomTitle(props, t('Markdown Settings')),
  69. component: <MarkDownSettingContents />,
  70. },
  71. customize: {
  72. title: useCustomTitle(props, t('Customize Settings')),
  73. component: <CustomizeSettingContents />,
  74. },
  75. importer: {
  76. title: useCustomTitle(props, t('Import Data')),
  77. component: <DataImportPageContents />,
  78. },
  79. export: {
  80. title: useCustomTitle(props, t('Export Archive Data')),
  81. component: <ExportArchiveDataPage />,
  82. },
  83. notification: {
  84. title: useCustomTitle(props, t('Notification Settings')),
  85. component: <NotificationSetting />,
  86. },
  87. 'global-notification': {
  88. title: '',
  89. component: <>global-notification</>,
  90. },
  91. 'slack-integration': {
  92. title: useCustomTitle(props, t('slack_integration')),
  93. component: <SlackIntegration />,
  94. },
  95. 'slack-integration-legacy': {
  96. title: useCustomTitle(props, t('Legacy_Slack_Integration')),
  97. component: <LegacySlackIntegration />,
  98. },
  99. users: {
  100. title: useCustomTitle(props, t('User_Management')),
  101. component: <UserManagement />,
  102. },
  103. 'user-groups': {
  104. title: useCustomTitle(props, t('UserGroup Management')),
  105. component: <UserGroupPage />,
  106. },
  107. search: {
  108. title: useCustomTitle(props, t('Full Text Search Management')),
  109. component: <ElasticsearchManagement />,
  110. },
  111. 'audit-log': {
  112. title: useCustomTitle(props, t('AuditLog')),
  113. component: <AuditLogManagement />,
  114. },
  115. };
  116. const content = adminPagesMap[name];
  117. const title = content.title;
  118. useCurrentUser(props.currentUser != null ? JSON.parse(props.currentUser) : null);
  119. // useSearchServiceConfigured(props.isSearchServiceConfigured);
  120. useIsSearchServiceReachable(props.isSearchServiceReachable);
  121. useSiteUrl(props.siteUrl);
  122. // useEnvVars(props.envVars);
  123. return (
  124. <AdminLayout title={title} selectedNavOpt={name}>
  125. {content.component}
  126. </AdminLayout>
  127. );
  128. };
  129. export const getServerSideProps: GetServerSideProps = async(context: GetServerSidePropsContext) => {
  130. const req: CrowiRequest = context.req as CrowiRequest;
  131. const { crowi } = req;
  132. const {
  133. appService, searchService,
  134. } = crowi;
  135. const { user } = req;
  136. const result = await getServerSideCommonProps(context);
  137. // check for presence
  138. // see: https://github.com/vercel/next.js/issues/19271#issuecomment-730006862
  139. if (!('props' in result)) {
  140. throw new Error('invalid getSSP result');
  141. }
  142. const props: Props = result.props as Props;
  143. if (user != null) {
  144. // props.currentUser = JSON.stringify(user.toObject());
  145. props.currentUser = JSON.stringify(user);
  146. }
  147. props.siteUrl = appService.getSiteUrl();
  148. props.nodeVersion = crowi.runtimeVersions.versions.node ? crowi.runtimeVersions.versions.node.version.version : null;
  149. props.npmVersion = crowi.runtimeVersions.versions.npm ? crowi.runtimeVersions.versions.npm.version.version : null;
  150. props.yarnVersion = crowi.runtimeVersions.versions.yarn ? crowi.runtimeVersions.versions.yarn.version.version : null;
  151. props.installedPlugins = pluginUtils.listPlugins();
  152. props.envVars = await ConfigLoader.getEnvVarsForDisplay(true);
  153. props.isSearchServiceConfigured = searchService.isConfigured;
  154. props.isSearchServiceReachable = searchService.isReachable;
  155. return {
  156. props,
  157. };
  158. };
  159. export default AdminMarkdownSettingsPage;